package pe.gob.sedapal.scmultimedia.rcp.view.estadocuenta;

import java.util.ArrayList;

import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IViewReference;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.wb.swt.ResourceManager;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.events.MouseTrackAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseAdapter;

import pe.gob.sedapal.scmultimedia.config.ApplicationContext;
import pe.gob.sedapal.scmultimedia.domain.Calle;
import pe.gob.sedapal.scmultimedia.domain.Distrito;
import pe.gob.sedapal.scmultimedia.domain.Localidad;
import pe.gob.sedapal.scmultimedia.domain.Numero;
import pe.gob.sedapal.scmultimedia.domain.Provincia;
import pe.gob.sedapal.scmultimedia.service.EstadoCuentaService;
import pe.gob.sedapal.scmultimedia.sessionbean.DataSessionBean;
import pe.gob.sedapal.scmultimedia.util.Constante;
import pe.gob.sedapal.scmultimedia.util.Messages;
import pe.gob.sedapal.scmultimedia.wb.swt.SWTResourceManager;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;

public class BuscarDireccionView extends ViewPart {

	public static final String ID = Constante.ID_BUSCAR_DIRECCION_VIEW;
	//public static final String ID = "scmultimedia.consultaEstadoCuentaView.buscarDireccionView";
	
	private EstadoCuentaService estadoCuentaService;
	private DataSessionBean dataSessionBean;
	
	private ArrayList<Provincia> provincias = new ArrayList<Provincia>();
	private ArrayList<Distrito> distritos = new ArrayList<Distrito>();
	private ArrayList<Localidad> localidades = new ArrayList<Localidad>();
	private ArrayList<Calle> calles = new ArrayList<Calle>();
	private ArrayList<Numero> numeros = new ArrayList<Numero>();
	
	private Text txtNumero;
	
	Combo comboProvincia;
	Combo comboDistrito;
	Combo comboLocalidad;
	private Text txtCalle;
		
	public BuscarDireccionView() {
		estadoCuentaService = (EstadoCuentaService)ApplicationContext.getBean(EstadoCuentaService.class);
		dataSessionBean = (DataSessionBean)ApplicationContext.getBean(DataSessionBean.class);
		provincias = (ArrayList<Provincia>) estadoCuentaService.listarProvinciasPorDepartamento(1L);//1 = DPTO LIMA
		dataSessionBean.limpiar();
	}

	@Override
	public void createPartControl(final Composite parent) {
		
//		parent.setBackground(SWTResourceManager.getColor(173, 216, 230));
		parent.setBackgroundImage(ResourceManager.getPluginImage("scmultimedia", Constante.RUTA_IMG_FONDO_SEDAPAL));
		parent.setBackgroundMode(SWT.INHERIT_DEFAULT);
		parent.setLayout(null);
		
		Label lblBsquedaPorNmero = new Label(parent, SWT.NONE);
		lblBsquedaPorNmero.setForeground(SWTResourceManager.getColor(51, 102, 153));
		lblBsquedaPorNmero.setFont(SWTResourceManager.getFont("FreeSans", 17, SWT.BOLD | SWT.ITALIC));
		lblBsquedaPorNmero.setBounds(45, 25, 267, 30);
		lblBsquedaPorNmero.setText(Messages.buscarDireccion_titulo);
		
		
		Label lblPorDireccion = new Label(parent, SWT.NONE);
		lblPorDireccion.setForeground(SWTResourceManager.getColor(51, 102, 153));
		lblPorDireccion.setFont(SWTResourceManager.getFont("FreeSans", 12, SWT.BOLD | SWT.ITALIC));
		lblPorDireccion.setBounds(318, 38, 252, 17);
		lblPorDireccion.setText(Messages.buscarDireccion_subtitulo);
		
		Label imgLogo = new Label(parent, SWT.NONE);
		imgLogo.setImage(ResourceManager.getPluginImage("scmultimedia", Constante.RUTA_IMG_LOGO_SEDAPAL_INTERNO));
		imgLogo.setBounds(635, 10, 192, 84);
		
		Label imgBarralbl = new Label(parent, SWT.NONE);
		imgBarralbl.setImage(ResourceManager.getPluginImage("scmultimedia", Constante.RUTA_IMG_BARRA));
		imgBarralbl.setBounds(10, 61, 736, 8);
		
		comboProvincia = new Combo(parent, SWT.NONE);
		comboProvincia.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseDown(MouseEvent e) {
				
			}
		});
		comboProvincia.setFont(org.eclipse.wb.swt.SWTResourceManager.getFont("Ubuntu", 16, SWT.NORMAL));
		comboProvincia.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				Combo combo = (Combo) e.getSource();
				String seleccion = combo.getText();
				System.out.println("MIRA AH!!!");
				dataSessionBean.setProvincia(obtenerProvinciaPorNombre(seleccion));				
				
				llenarComboDistrito();
			}
		});
		llenarComboProvincia();
		comboProvincia.setBounds(80, 108, 280, 37);
		
		comboDistrito = new Combo(parent, SWT.NONE);
		comboDistrito.setFont(org.eclipse.wb.swt.SWTResourceManager.getFont("Ubuntu", 16, SWT.NORMAL));
		comboDistrito.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				Combo combo = (Combo) e.getSource();
				String seleccion = combo.getText();
				
				dataSessionBean.setDistrito(obtenerDistritoPorNombre(seleccion));
				
				llenarComboLocalidad();
			}
		});
		comboDistrito.setBounds(80, 174, 412, 37);
		
		comboLocalidad = new Combo(parent, SWT.NONE);
		comboLocalidad.setFont(org.eclipse.wb.swt.SWTResourceManager.getFont("Ubuntu", 16, SWT.NORMAL));
		comboLocalidad.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				Combo combo = (Combo) e.getSource();
				String seleccion = combo.getText();
				
				dataSessionBean.setLocalidad(obtenerLocalidadPorNombre(seleccion));
				
				llenarCalles();
			}
		});
		comboLocalidad.setBounds(80, 240, 599, 37);
		
		txtCalle = new Text(parent, SWT.BORDER);
		txtCalle.setFont(org.eclipse.wb.swt.SWTResourceManager.getFont("Ubuntu", 16, SWT.NORMAL));
		txtCalle.setEditable(false);
		
		txtCalle.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseDown(MouseEvent e) {
				if(dataSessionBean.getLocalidad() != null){
					if(calles.size() > 0){
						@SuppressWarnings("unused")
						CallesShell callesShell = new CallesShell(parent.getShell(),getBuscarDireccionView());						
					}else{
						MessageDialog.openInformation(parent.getShell(), Constante.MSG_ERROR, Constante.MSG_LOCALIDAD_SIN_CALLES);	
					}

				}else{
					MessageDialog.openInformation(parent.getShell(), Constante.MSG_ERROR, Constante.MSG_SELECCIONAR_LOCALIDAD);
				}
			}
		});
		txtCalle.setBounds(80, 306, 412, 37);
		
		txtNumero = new Text(parent, SWT.BORDER);
		txtNumero.setFont(org.eclipse.wb.swt.SWTResourceManager.getFont("Ubuntu", 16, SWT.NORMAL));
		txtNumero.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseDown(MouseEvent e) {
				if(dataSessionBean.getCalle() != null){
					if(numeros.size() > 0){
						@SuppressWarnings("unused")
						NumerosShell numerosShell = new NumerosShell(parent.getShell(),getBuscarDireccionView());						
					}else{
						MessageDialog.openInformation(parent.getShell(), Constante.MSG_ERROR, Constante.MSG_CALLE_SIN_NUMEROS);
					}

				}else{
					MessageDialog.openInformation(parent.getShell(), Constante.MSG_ERROR, Constante.MSG_SELECCIONAR_CALLE);
				}
			}
		});
		txtNumero.setEditable(false);
		txtNumero.setBounds(80, 372, 280, 37);
		
		limpiarDatosDeSesion();
		limpiarTextos();
		
		Label lblProvincia = new Label(parent, SWT.NONE);
		lblProvincia.setFont(org.eclipse.wb.swt.SWTResourceManager.getFont("Ubuntu", 12, SWT.BOLD));
		lblProvincia.setForeground(SWTResourceManager.getColor(Constante.VALOR_FUENTE_RED,Constante.VALOR_FUENTE_GREEN,Constante.VALOR_FUENTE_BLUE));
		lblProvincia.setBounds(80, 85, 81, 17);
		lblProvincia.setText(Messages.buscarDireccion_etiqueta_provincia);
		
		Label lblDistrito = new Label(parent, SWT.NONE);
		lblDistrito.setFont(org.eclipse.wb.swt.SWTResourceManager.getFont("Ubuntu", 12, SWT.BOLD));
		lblDistrito.setForeground(SWTResourceManager.getColor(Constante.VALOR_FUENTE_RED,Constante.VALOR_FUENTE_GREEN,Constante.VALOR_FUENTE_BLUE));
		lblDistrito.setBounds(80, 151, 65, 17);
		lblDistrito.setText(Messages.buscarDireccion_etiqueta_distrito);
		
		Label lblLocalidad = new Label(parent, SWT.NONE);
		lblLocalidad.setFont(org.eclipse.wb.swt.SWTResourceManager.getFont("Ubuntu", 12, SWT.BOLD));
		lblLocalidad.setForeground(SWTResourceManager.getColor(Constante.VALOR_FUENTE_RED,Constante.VALOR_FUENTE_GREEN,Constante.VALOR_FUENTE_BLUE));
		lblLocalidad.setBounds(80, 217, 81, 17);
		lblLocalidad.setText(Messages.buscarDireccion_etiqueta_localidad);
		
		Label lblCalle = new Label(parent, SWT.NONE);
		lblCalle.setFont(org.eclipse.wb.swt.SWTResourceManager.getFont("Ubuntu", 12, SWT.BOLD));
		lblCalle.setForeground(SWTResourceManager.getColor(Constante.VALOR_FUENTE_RED,Constante.VALOR_FUENTE_GREEN,Constante.VALOR_FUENTE_BLUE));
		lblCalle.setBounds(80, 283, 45, 19);
		lblCalle.setText(Messages.buscarDireccion_etiqueta_calle);
		
		Label lblNumero = new Label(parent, SWT.NONE);
		lblNumero.setFont(org.eclipse.wb.swt.SWTResourceManager.getFont("Ubuntu", 12, SWT.BOLD));
		lblNumero.setForeground(SWTResourceManager.getColor(Constante.VALOR_FUENTE_RED,Constante.VALOR_FUENTE_GREEN,Constante.VALOR_FUENTE_BLUE));
		lblNumero.setBounds(80, 349, 70, 17);
		lblNumero.setText(Messages.buscarDireccion_etiqueta_numero);
		
		final Label btnAceptar = new Label(parent, SWT.CENTER);
		btnAceptar.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseDown(MouseEvent e) {
				
				if(dataSessionBean.getNumero()!= null){
					IWorkbenchPage pagina = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
					IViewReference vistaActual = pagina.findViewReference(BuscarDireccionView.ID);
					
					try{
						pagina.showView(SuministrosPorNumeroView.ID);					
					}catch(Exception ex){
						ex.printStackTrace();
					}
					pagina.hideView(vistaActual);
				}else{
					MessageDialog.openInformation(parent.getShell(), Constante.MSG_ERROR, Constante.MSG_COMPLETAR_DATOS);
				}
					
			}
		});
		
		btnAceptar.addMouseTrackListener(new MouseTrackAdapter() {
			@Override
			public void mouseEnter(MouseEvent e) {
				btnAceptar.setImage(org.eclipse.wb.swt.ResourceManager.getPluginImage("scmultimedia", Constante.RUTA_BOTON_ACEPTAR_OFF));
			}
			@Override
			public void mouseExit(MouseEvent e) {
				btnAceptar.setImage(org.eclipse.wb.swt.ResourceManager.getPluginImage("scmultimedia", Constante.RUTA_BOTON_ACEPTAR_ON));
			}
		});
		btnAceptar.setImage(org.eclipse.wb.swt.ResourceManager.getPluginImage("scmultimedia", Constante.RUTA_BOTON_ACEPTAR_OFF));
		btnAceptar.setBounds(130, 430, 169, 58);
		
		 final Label btnBorrar = new Label(parent, SWT.CENTER);
		btnBorrar.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseDown(MouseEvent e) {
				limpiarDatosDeSesion();
				limpiarTextos();
			}
		});
		btnBorrar.addMouseTrackListener(new MouseTrackAdapter() {
			@Override
			public void mouseEnter(MouseEvent e) {
				btnBorrar.setImage(org.eclipse.wb.swt.ResourceManager.getPluginImage("scmultimedia", Constante.RUTA_BOTON_LIMPIAR_DIRECCION_OFF));
			}
			@Override
			public void mouseExit(MouseEvent e) {
				btnBorrar.setImage(org.eclipse.wb.swt.ResourceManager.getPluginImage("scmultimedia", Constante.RUTA_BOTON_LIMPIAR_DIRECCION));
			}
		});
		btnBorrar.setImage(org.eclipse.wb.swt.ResourceManager.getPluginImage("scmultimedia", Constante.RUTA_BOTON_LIMPIAR_DIRECCION_OFF));
		btnBorrar.setBounds(305, 430, 169, 58);
		
		final Label lblRegresar = new Label(parent, SWT.NONE);
		lblRegresar.addMouseTrackListener(new MouseTrackAdapter() {
			@Override
			public void mouseEnter(MouseEvent e) {
				lblRegresar.setImage(org.eclipse.wb.swt.ResourceManager.getPluginImage("scmultimedia", Constante.RUTA_BOTON_REGRESAR_OFF));
			}
			@Override
			public void mouseExit(MouseEvent e) {
				lblRegresar.setImage(org.eclipse.wb.swt.ResourceManager.getPluginImage("scmultimedia", Constante.RUTA_BOTON_REGRESAR_ON));
			}
		});
		lblRegresar.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseDown(MouseEvent e) {
				IWorkbenchPage pagina = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
				IViewReference vistaActual = pagina.findViewReference(BuscarDireccionView.ID);
				
				pagina.hideView(vistaActual);
				
				try{
					pagina.showView(ConsultaEstadoCuentaView.ID);
				}catch(Exception ex){
					ex.printStackTrace();
				}				
			}
		});
		lblRegresar.setImage(org.eclipse.wb.swt.ResourceManager.getPluginImage("scmultimedia", Constante.RUTA_BOTON_REGRESAR_OFF));
		lblRegresar.setAlignment(SWT.CENTER);
		lblRegresar.setBounds(510, 430, 169, 58);
	}

	public void limpiarDatosDeSesion(){
		dataSessionBean.setProvincia(null);
		dataSessionBean.setDistrito(null);
		dataSessionBean.setLocalidad(null);
		dataSessionBean.setCalle(null);
		dataSessionBean.setNumero(null);
	}
	
	public void limpiarTextos(){
		if(dataSessionBean.getNumero() == null){
			txtNumero.setText(Constante.MSG_SELECCIONAR_DATO_COMBO);
			if(dataSessionBean.getCalle() == null){
				txtCalle.setText(Constante.MSG_SELECCIONAR_DATO_COMBO);
				if(dataSessionBean.getLocalidad() == null){
					comboLocalidad.setText(Constante.MSG_SELECCIONAR_DATO_COMBO);
					if(dataSessionBean.getDistrito() == null){
						comboDistrito.setText(Constante.MSG_SELECCIONAR_DATO_COMBO);
						if(dataSessionBean.getProvincia() == null){
							comboProvincia.setText(Constante.MSG_SELECCIONAR_DATO_COMBO);
						}
					}			
				}			
			}			
		}
	}
	
	public void llenarComboProvincia(){
		comboProvincia.removeAll();
		for (Provincia provincia : provincias) {
			comboProvincia.add(provincia.getNomDepto());
		}
	}
	
	public void llenarComboDistrito(){
		distritos = (ArrayList<Distrito>) estadoCuentaService.listarDistritosPorProvincia(dataSessionBean.getProvincia().getCodDepto());
		comboDistrito.removeAll();
		for (Distrito distrito : distritos) {
			comboDistrito.add(distrito.getNomMunic());
		}
		
		comboLocalidad.removeAll();
		dataSessionBean.setDistrito(null);
		dataSessionBean.setLocalidad(null);
		dataSessionBean.setCalle(null);
		dataSessionBean.setNumero(null);
		
		limpiarTextos();
	}
	
	public void llenarComboLocalidad(){
		localidades = (ArrayList<Localidad>) estadoCuentaService.listarLocalidadesPorDistrito(dataSessionBean.getDistrito().getCodMunic());
		comboLocalidad.removeAll();
		for (Localidad localidad : localidades) {
			comboLocalidad.add(localidad.getNomLocal());
		}
		
		dataSessionBean.setLocalidad(null);
		dataSessionBean.setCalle(null);
		dataSessionBean.setNumero(null);
		
		limpiarTextos();
	}
	
	public void llenarCalles(){
		calles = (ArrayList<Calle>) estadoCuentaService.listarCallesPorLocalidad(dataSessionBean.getLocalidad().getCodLocal());
		dataSessionBean.setCalle(null);
		dataSessionBean.setNumero(null);
		
		limpiarTextos();
	}
	
	public void llenarNumeros(){
		numeros = (ArrayList<Numero>) estadoCuentaService.listarNumerosPorCalle(dataSessionBean.getCalle().getCodCalle());
		dataSessionBean.setNumero(null);
		
		limpiarTextos();
	}
		
	public Provincia obtenerProvinciaPorNombre(String nombre){
		for (Provincia provincia : provincias) {
			if(provincia.getNomDepto().equals(nombre)){
				return provincia;
			}
		}
		return null;
	}
	
	public Distrito obtenerDistritoPorNombre(String nombre){
		for (Distrito distrito : distritos) {
			if(distrito.getNomMunic().equals(nombre)){
				return distrito;
			}
		}
		return null;
	}
	
	public Localidad obtenerLocalidadPorNombre(String nombre){
		for (Localidad localidad : localidades) {
			if(localidad.getNomLocal().equals(nombre)){
				return localidad;
			}
		}
		return null;
	}
	
	public Calle obtenerCallePorNombre(String nombre){
		for (Calle calle : calles) {
			if(calle.getNomCalle().equals(nombre)){
				return calle;
			}
		}
		return null;
	}
	
	public Numero obtenerNumeroPorNombre(String nombre){
		for (Numero numero : numeros) {
			if(numero.getNumPuerta().toString().equals(nombre)){
				return numero;
			}
		}
		return null;
	}

	@Override
	public void setFocus() {
		// TODO Auto-generated method stub

	}

	public Text getTxtNumero() {
		return txtNumero;
	}

	public void setTxtNumero(Text txtNumero) {
		this.txtNumero = txtNumero;
	}
	
	public final BuscarDireccionView getBuscarDireccionView(){
		return this;
	}

	public ArrayList<Calle> getCalles() {
		return calles;
	}

	public void setCalles(ArrayList<Calle> calles) {
		this.calles = calles;
	}

	public Text getTxtCalle() {
		return txtCalle;
	}

	public void setTxtCalle(Text txtCalle) {
		this.txtCalle = txtCalle;
	}

	public ArrayList<Numero> getNumeros() {
		return numeros;
	}

	public void setNumeros(ArrayList<Numero> numeros) {
		this.numeros = numeros;
	}
	
}